/**
 * @file    framework/building.h
 * @brief   Include all components of the building framework
 ****************************************************************************
 * @version 0.6.030 $Id: building.h 2258 2010-04-02 13:02:21Z alex $
 * @author  Alessandro Polo
 ****************************************************************************/
/*! @namespace wosh::building
 * @brief   Classes designed to represent building and the whole house.
 *          They provide an higher abstraction of devices (such as lights, appliances, audio box, ..)
 * @see     Refer to wosh::building::BuildingObject interface and wosh::services::BuildingManagerBundle.
 * @see     \ref page_framework_building
 *
 ****************************************************************************/
/*! \page page_framework
 * \htmlonly <hr/> \endhtmlonly
 * \section page_framework_building WOSH Building Framework
 *
 * The \c building namespace provides a set of classes designed to represent 
 * (virtually) a generic building (your house, rooms, floors, appliances, ..).
 * There objects are based (inherits) wosh::BuidingObject which defines standard
 * methods and access rules. Objects have a hierarchical view (by user's point of view).
 *
 * Building objects offer a standard high-level way to access home features
 * and group them as an user-friendly hierarchical tree.
 * Some of them (as a generic floor) is mostly a collector of child objects (rooms),
 * as a generic room manages its children (appliances, lights, ..) and so on.
 * Moreover each interface provide some specific properties and methods.
 *
 * Building objects often interacts with devices (wosh::Device), as usual this is
 * implemented over bus-messaging.
 *
 * Building objects are managed by (optional) service wosh::services::BuildingManagerBundle.
 * This manager creates a custom Bus (wosh.Bus.Building) which is used for
 * exchangin messages between building objects (so they won't flood other busses).
 *
 * Building Manager implements the routing/queuing of messages, connecting
 * wosh.Bus.Building with wosh.Bus.Device.
 *
 * Probably this is a bit confusing, so let's see the full flow of a building object
 * representing a generic Light (wosh::building::Light):
 *  - assume we have a real relay controlled by PC (using X10 for example)
 *  - a custom service will map the relay to a virtual device object (wosh::services::HeyuBundle for example),
 *    which is also defined as wosh::Device interface (wosh::interfaces::devices::Switch).
 *    At this stage, we are able to control the real relay calling standard methods,
 *    let's assume the service to be able to monitor the relay, device will also 
 *    raise events on the Bus (as StateChanged). See \ref page_core_devices for more information.
 *
 * Before going on, I would underline some aspects:
 *  - the real relay is wired to something, a light for example, moreover there must
 *    be a specific service and addressing for accessing it.
 *    That's why we need a service (Heyu in previous example) as bridge to the
 *    standard interface of a generic device.
 *  - then we have real relay mapped (in some way) to a standard interface like
 *    wosh::interfaces::devices::Switch. WOSH has no information about the role
 *    of the real device.
 *    An user may turn on that light easily but he should remember its WOSH name
 *    mapped to real object
 *  - We need an higher abstraction
 *
 * A wosh::building::Light is mapped (by configuration) to one or more switches,
 * controlling them and keeping its state updated.
 * 
 * Its parent: a wosh::building::Room object will monitor the Light (as child),
 * and update the LightState property when the state changes, for example.
 *
 *
 * Some implemented objects are (by default hierarchical view):
 *  - wosh::building::House
 *    - wosh::building::Garden (customization of wosh::building::Floor)
 *    - wosh::building::Floor
 *      - wosh::building::Room
 *        - wosh::building::Appliance
 *        - wosh::building::AudioBox
 *        - wosh::building::Door
 *        - wosh::building::DoorBell
 *        - wosh::building::Light
 *        - wosh::building::Window
 *
 * Let's ispect some features of the wosh::building::Room class as a typical example:
 *  - Properties: wosh::building::Room::PresenceState, wosh::building::Room::LightState, ..
 *  - Events: PresenceChanged, LightChanged, NoiseChanged, ..
 *  - Methods: lights_on, lights_off, ..
 *  - Interaction: wosh::interfaces::devices::SensorMotion, wosh::interfaces::devices::SensorLight, wosh::building::Appliance, wosh::building::Light, wosh::building::AudioBox, ..
 *
 *
 * Moreover a generic location may be represented with wosh::building::Location
 * class.
 *
 * \warning wosh::building::Location is related to BigBrother, Users' location
 *          and has NOT been standardized yet.
 *
 * [..]
 *
 *
 ****************************************************************************/
/* Copyright (c) 2007-2010, WOSH - Wide Open Smart Home 
 * by Alessandro Polo - OpenSmartHome.com
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the OpenSmartHome.com WOSH nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY Alessandro Polo ''AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL Alessandro Polo BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ****************************************************************************/

#ifndef __WOSH_FrameWork_Building_H__
 #define __WOSH_FrameWork_Building_H__

 #include <woshDefs.h>

namespace wosh {
 namespace building { };
};

 #include <framework/building/BuildingObject.h>

 #include <framework/building/Appliance.h>
 #include <framework/building/AudioBox.h>
 #include <framework/building/Door.h>
 #include <framework/building/DoorBell.h>
 #include <framework/building/Floor.h>
 #include <framework/building/Garden.h>
 #include <framework/building/House.h>
 #include <framework/building/Light.h>
 #include <framework/building/Location.h>
 #include <framework/building/Room.h>
 #include <framework/building/Window.h>



#endif //__WOSH_FrameWork_Building_H__
